<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>

  <!-- <script>
    /* 其他的实现方式1
    Function.prototype.myBind = function (thisArg, ...boundArgs) {
      if (typeof this !== 'function') {
        throw new TypeError('Bind must be called on a function');
      }

      const self = this;

      const proxy = (...args) => {
        // 如果 thisArg 是 null 或 undefined，则默认绑定到全局对象
        const context = thisArg === null || thisArg === undefined ? globalThis : thisArg;
        const finalArgs = boundArgs.concat(args);
        return self.apply(context, finalArgs);
      };

      // 保持原始函数的原型属性
      proxy.prototype = Object.create(self.prototype);

      return proxy;
    };
    */
    /* 其他的实现方式2
    Function.prototype.myBind = function (thisArg, ...boundArgs) {
        const self = this;

        // 创建一个新的函数，用于返回一个具有正确 `this` 绑定的函数
        const proxy = (...restArgs) => {
          // 合并绑定的参数和实际传递的参数
          return self.apply(thisArg, [...boundArgs, ...restArgs]);
        };

        // 保持原始函数的原型属性
        proxy.prototype = Object.create(self.prototype);

        return proxy;
      };
    */
    Function.prototype.myBind = function (thisArg, ...args) {
      return (...restArgs) => { // 巧妙的运用箭头函数将this指向上一个作用域的this
        // 也就是调用这个myBind函数的对象，就是需要重新指向this的函数
        return this.call(thisArg, ...args, ...restArgs); // 调用原函数并传入参数
      }
    }

    const student = {
      name: 'xiaowu'
    }

    function func(num1, num2, num3, num4) {
      console.log(this);
      console.log(num1, num2, num3, num4);
      return num1 + num2 + num3 + num4;
    }

    const myFunc = func.myBind(student, 1, 2)

    console.log(myFunc(3, 4));
  </script> -->
  <script>
    Function.prototype.myBind = function (thisArg, ...args) {
      return (...args2) => {
        return this.call(thisArg, ...args, ...args2)
      }
    }

    function func1() {
      console.log("this: ", this);
      console.log(this);
    }
    let obj = {
      name: "tom",
      age: 12
    }
    const func2 = func1.myBind(obj);
    func2();
  </script>
</body>

</html>